"""
Project Euler Problem 8: https://projecteuler.net/problem=8

Largest product in a series

The four adjacent digits in the 1000-digit number that have the greatest
product are 9 × 9 × 8 × 9 = 5832.

    73167176531330624919225119674426574742355349194934
    96983520312774506326239578318016984801869478851843
    85861560789112949495459501737958331952853208805511
    12540698747158523863050715693290963295227443043557
    66896648950445244523161731856403098711121722383113
    62229893423380308135336276614282806444486645238749
    30358907296290491560440772390713810515859307960866
    70172427121883998797908792274921901699720888093776
    65727333001053367881220235421809751254540594752243
    52584907711670556013604839586446706324415722155397
    53697817977846174064955149290862569321978468622482
    83972241375657056057490261407972968652414535100474
    82166370484403199890008895243450658541227588666881
    16427171479924442928230863465674813919123162824586
    17866458359124566529476545682848912883142607690042
    24219022671055626321111109370544217506941658960408
    07198403850962455444362981230987879927244284909188
    84580156166097919133875499200524063689912560717606
    05886116467109405077541002256983155200055935729725
    71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number that have the
greatest product. What is the value of this product?
"""

# _*_ conding:UTF-8 _*_
'''
@author = Kuperain
@email = kuperain@aliyun.com
@IDE = Thonny Python3.8
@creat_time = 2022/5/5
'''

STRING = '''
    73167176531330624919225119674426574742355349194934
    96983520312774506326239578318016984801869478851843
    85861560789112949495459501737958331952853208805511
    12540698747158523863050715693290963295227443043557
    66896648950445244523161731856403098711121722383113
    62229893423380308135336276614282806444486645238749
    30358907296290491560440772390713810515859307960866
    70172427121883998797908792274921901699720888093776
    65727333001053367881220235421809751254540594752243
    52584907711670556013604839586446706324415722155397
    53697817977846174064955149290862569321978468622482
    83972241375657056057490261407972968652414535100474
    82166370484403199890008895243450658541227588666881
    16427171479924442928230863465674813919123162824586
    17866458359124566529476545682848912883142607690042
    24219022671055626321111109370544217506941658960408
    07198403850962455444362981230987879927244284909188
    84580156166097919133875499200524063689912560717606
    05886116467109405077541002256983155200055935729725
    71636269561882670428252483600823257530420752963450
    '''

from functools import reduce

def product(string: str) -> int:
    '''
    >>> product('')
    0
    >>> product('12345')
    120
    >>> product('102345')
    0
    '''
    if string:
        if '0' in string:
            return 0
        
        return reduce(lambda x,y : x*y, map(int, string))
        
    else: # ''
        return 0 

def solution1(string: str = STRING, n = 13) -> int:
    '''
    >>> solution1(n=4)
    (5832, '9989')
    >>> solution1()
    (23514624000, '5576689664895')
    '''
    separators = ['\n', ' ']
    for sep in separators:
        string = string.replace(sep, '')
        
    length = len(string)
    
    greatest_product = product(string[:n])
    index = 0
    i=0
    while i <= length-n:
        try:
            if string[i] >= string[i+n]:  # if i+n = len, raise IndexError: string index out of range
                i += 1 # just move 
                continue
        except:
            pass
          
        i += 1
        
        index_0 = string[i:i+n].find('0')
        if index_0 >= 0: # exist 0
            i += index_0 + 1 # jump
            continue
        
        tmp = product(string[i:i+n])
        if tmp > greatest_product:
            greatest_product = tmp
            index = i
        

    
    return greatest_product, string[index:index+n]

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose = False)
    
    
    print(f"{solution1() = }")


    


